# Python3 集合
# 集合（set）是一个无序的不重复元素序列。
# 可以使用大括号 { } 或者 set() 函数创建集合，注意：创建一个空集合必须用 set() 而不是 { }，因为 { } 是用来创建一个空字典。
import random

set1 = {1, 2, 3, 4}
list1 = [1, 1, 1, 1, 1, 2, 2, 2, 2]
str1 = 'hello'
# 空集合
set2 = set()
print(set(list1))
print(set(str1))
print(set2)

# 集合之间的运算
# 名词解释
# S & T 或 S . intersection ( T )	交集。返回一个新集合,包括同时在集合 S 和 T 中的元素
# S|T 或 S . union ( T )	并集。返回一个新集合,包括集合 S 和 T 中的所有元素
# S - T 或 S . difference ( T )	差集。返回一个新集合,包括在集合 S 中但不在集合 T 中的元素
# S^T或 s . symmetric _ difference _ update ( T )	补集。返回一个新集合,包括集合 S 和 T 中的元素,但不包括同时在其中的元素
# s <= T 或 S . issubset ( T )	子集测试。如果 S 与 T 相同或 S 是 T 的子集,返回 True ,否则返回 False 。可以用 S < T 判断 S 是否是 T 的真子集
# S >=Т或 S . issuperset (T)	超集测试。如果 S 与 T 相同或 S 是 T 的超集,返回 True ,否则返回 False 。可以用 S > T 判断 S 是否是 T 的真超集
a = set('abcdefgh')
b = set('ghjklst')
# 集合a中包含而集合b中不包含的元素
print(a - b)
# 集合a或b中包含的所有元素
print(a | b)
# 集合a和b中都包含了的元素
print(a & b)
# 不同时包含于a和b的元素
print(a ^ b)

# 集合的基本操作
# 1、添加元素 集合.add()
set3 = set()
for x in range(20):
    set3.add(random.randint(1, 30))
print(set3)
# 2、添加元素 集合.update() update中的必须是iterable类型的数据 例如列表字典集合等
set3.update({'1': 100, '2': 200, '3': 300})
set3.update([111, 222, 333])
set3.update(('x', 'y', 'z'))
print(set3)

# 3、移除元素 由于集合的无序性 所以删除集合中的元素只能根据元素内容删除 如果元素不存在，则会发生错误。
set3.remove(333)
print(set3)
# 删除元素如果元素不存在也不会报错的删除 集合.discard(元素)
set3.discard(3333)
print(set3)
# 随机删除一条元素 集合.pop()
set3.pop()
print(set3)

# 集合的常见方法以及使用
# len(s) 计算集合 s 元素个数
# s.clear() 清空集合 s
# x in s 判断x是否在集合内
# add()	为集合添加元素
# clear()	移除集合中的所有元素
# copy()	拷贝一个集合
# difference()	返回多个集合的差集
# difference_update()	移除集合中的元素，该元素在指定的集合也存在。
# discard()	删除集合中指定的元素
# intersection()	返回集合的交集
# intersection_update()	返回集合的交集。
# isdisjoint()	判断两个集合是否包含相同的元素，如果没有返回 True，否则返回 False。
# issubset()	判断指定集合是否为该方法参数集合的子集。
# issuperset()	判断该方法的参数集合是否为指定集合的子集
# pop()	随机移除元素
# remove()	移除指定元素
# symmetric_difference()	返回两个集合中不重复的元素集合。
# symmetric_difference_update()	移除当前集合中在另外一个指定集合相同的元素，并将另外一个指定集合中不同的元素插入到当前集合中。
# union()	返回两个集合的并集
# update()	给集合添加元素

课代表 = {'张三', '李四', '王五'}
三好学生 = {'建国', '李伟', '王鹏', '小明', '李四'}
劳动积极分子 = {'李雷', '韩梅梅', '建国', '张三'}
编程兴趣班成员 = {'张三', '李四', '王鹏', '韩梅梅', '赵云'}

# 1.三好学生和劳动积极分子有谁？
# 2.不在编程兴趣班的课代表是哪个？
# 3.不是课代表的编程兴趣班成员有谁？
# 4.课代表，三好学生都参加的是谁？
# 5.课代表，三好学生，劳动积极分子和编程兴趣班成员总共有哪些？


print(三好学生 | 劳动积极分子)
print(课代表 - 编程兴趣班成员)
print(课代表 ^ 编程兴趣班成员)
print(课代表 & 三好学生)
print(课代表 | 三好学生 | 劳动积极分子 | 编程兴趣班成员)
